/**
* @Arquivo: pl.h
* 
*	Lagrangeano em MPI
*
* @author: Marcio Costa Santos
* @data: 20/05/2010
*
*/

#ifndef LAGRANGEAN_H_
#define LAGRANGEAN_H_

#include "vertexOrders.h"
#include "bitMapGraph.h"
#include "graphMacros.h"
#include <stdlib.h>
#include "pl.h"
#include <cplex.h>
#include <string.h>
#include <alloca.h>
#include <mpi.h>

double lambda[MAX_SIZE];//multiplicadores  da relaçao de gambiarra
double mu[MAX_SIZE];//multiplicadores das restrições de representação
double Lx[MAX_SIZE];//a ultima posição é o problema de seleção

/*Inicia o algoritmo do lagrangeao e faz as definições necessárias*/
int define();

/*Inicializa o CPLEX para resolver os subproblemas*/
int makePL(long v);

/*Calcula o limite superior para o problema*/
double calculateUB();

/*Calcula o limite inferior para o problema*/
double calculateLB();

/*Atualiza os multiplicadores lagrangeanos*/
int updateMuLambda();

/*Resolve o problema de programação linear do vertice va[v]*/
double solvePL(int v);

/*Modifica a função objetivo do problema associado ao vertice va[v]*/
int addObjFunc(long v);

/*Resolve a relaxação lagrangeana com o metodo do subgradiente*/
double lagrangian(double* sol);


/***************************Funções de paralelismo********************************/

/*Envia os multiplicadores para todos os subproblemas*/
void sendMu();

/*Recebe a solução enviada por cada outro nó*/
void receiveSol();

/*Finaliza os processos*/
void endProcs();

/*Atualiza os multiplicadores nos slaves e resolve os subproblemas*/
void receiveUpdate(double* data, int* active);

/*Envia a solução dos subproblemas para o master*/
void sendSol();

#endif
